package de.grosjohann.android.feuerwehr.widget;

import java.util.Date;

import org.json.JSONException;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.util.Log;
import android.widget.RemoteViews;
import de.grosjohann.android.feuerwehr.R;
import de.grosjohann.android.feuerwehr.adapter.CalendarListAdapter;
import de.grosjohann.android.feuerwehr.domain.CalendarItem;
import de.grosjohann.android.feuerwehr.domain.Fahrzeug;
import de.grosjohann.android.feuerwehr.domain.FireIndex;
import de.grosjohann.android.feuerwehr.domain.WeatherWarning;
import de.grosjohann.android.feuerwehr.service.CalendarNotificationService;
import de.grosjohann.android.feuerwehr.service.FMSNotificationService;
import de.grosjohann.android.feuerwehr.service.WeatherNotificationService;
import de.grosjohann.android.feuerwehr.util.FileUtil;
import de.grosjohann.android.feuerwehr.util.JSON2ObjectUtil;

public class InfoWidgetProvider
  extends AppWidgetProvider {

  private static final String NAME = "InfoWidgetProvider";

  @Override
  public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    Log.d(NAME, "update");
    try {
      /*
       * Waldbrandindex und hoechste Wetterwarnung ermitteln.
       */
      String jsonWeather = FileUtil.readFile(context, WeatherNotificationService.WEATHER_DATA);
      FireIndex fireIndex = JSON2ObjectUtil.getFireIndex(jsonWeather);
      WeatherWarning highestWarning =
          WeatherWarning.getHighestWarning(JSON2ObjectUtil.getWeatherWarningList(jsonWeather));

      /*
       * zuletzt gesetzten Fahrzeug-Status ermitteln.
       */
      String jsonFms = FileUtil.readFile(context, FMSNotificationService.FMS_STATUS_DATA);
      Fahrzeug latestUpdate = null;
      for (Fahrzeug fahrzeug : JSON2ObjectUtil.getFahrzeugList(jsonFms)) {
        if (latestUpdate == null || fahrzeug.getChangeDate().after(latestUpdate.getChangeDate())) {
          latestUpdate = fahrzeug;
        }
      }

      /*
       * naechsten Dienst ermitteln
       */
      String jsonCal = FileUtil.readFile(context, CalendarNotificationService.CALENDAR_DATA);
      CalendarItem nextCalItem = null;
      Date now = new Date(System.currentTimeMillis());
      for (CalendarItem item : JSON2ObjectUtil.getCalendarItems(jsonCal)) {
        if (now.before(item.getEndDate())) {
          nextCalItem = item;
          break;
        }
      }

      appWidgetManager.updateAppWidget(appWidgetIds[0],
          buildUpdate(context, latestUpdate, fireIndex, highestWarning, nextCalItem));
    } catch (JSONException ex) {
      Log.e(NAME, ex.getMessage());
    }

  }

  private RemoteViews buildUpdate(Context context, Fahrzeug fahrzeug, FireIndex fireIndex,
      WeatherWarning weatherWarning, CalendarItem calItem) {

    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.info_widget);

    views.setTextViewText(R.id.tvWdgBezeichnung, fahrzeug.getDescription());
    switch (fahrzeug.getStatus()) {
      case EINSATZBEREIT_FUNK:
      case EINSATZBEREIT_GH:
        views.setInt(R.id.tvWdgStatusLine, "setBackgroundColor", android.graphics.Color.GREEN);
        break;
      case EINSATZ_UEBERNOMMEN:
      case EINSATZSTELLE_AN:
      case NOTRUF:
        views.setInt(R.id.tvWdgStatusLine, "setBackgroundColor", android.graphics.Color.RED);
        break;
      case NICHT_EINSATZBEREIT:
        views.setInt(R.id.tvWdgStatusLine, "setBackgroundColor", android.graphics.Color.LTGRAY);
        break;
    }

    views.setTextViewText(R.id.tvWdgKennung, fahrzeug.getIdentifier());
    views.setTextViewText(R.id.tvWdgStatusLang, context.getString(fahrzeug.getStatus().getResId()));

    views.setInt(R.id.tvWdgFireIndexBox, "setBackgroundColor", fireIndex.getColor());
    views.setInt(R.id.tvWdgWeatherWarningBox, "setBackgroundColor", weatherWarning.getColor());

    views.setTextViewText(R.id.tvWdgCalHeadline, calItem.getHeadline());
    views.setTextViewText(R.id.tvWdgCalDate,
        CalendarListAdapter.formatPeriod(context, calItem.getStartDate(), calItem.getEndDate()));

    return views;
  }
}
